﻿//------------------------------------------------------------
// by mky 2022/6/25
//------------------------------------------------------------
#ifndef FACE_TERMINAL_MQTT_H_
#define FACE_TERMINAL_MQTT_H_

//------------------------------------------------------------
#include <string>

//------------------------------------------------------------
extern "C" {
	//------------------------------------------------------------
	// 客户端句柄
	//------------------------------------------------------------
	typedef void* mv_mqtt_instance_t;
	//------------------------------------------------------------
	// handle 数据结构
	// 经典用法  mv_mqtt_instance_impl_tt* impl = reinterpret_cast<decltype(impl)>(handle)
	//------------------------------------------------------------
	typedef struct mv_mqtt_instance_impl_tt
	{
		std::string broker_address;
		std::string client_id;
		std::string product_key;
		std::string device_name;
		std::string version = "1.0";

		uint32_t qos;
		uint32_t connection_timeout;
		uint32_t send_timeout;

		std::string trust_store;
		std::string key_store;
		std::string CApath;
		std::string private_key_password;
		std::string sn;
		std::string deviceNum;

		std::string device_secret;
		std::string register_time;
		std::string product_secret;

		std::string username;
		std::string password;

		std::string aes_decrypt_key = "";
		std::string aes_decrypt_iv = "";

		std::string config_path;

		std::string app_id;
		std::string cloud_address;
	}mv_mqtt_instance_impl_tt;
	//------------------------------------------------------------
	// @brief 接收消息的回调函数
	// @param instance     客户端句柄
	// @param topic        接收消息主题
	// @param recv_message 消息数据
	// @return void
	//------------------------------------------------------------
	typedef void(*mqtt_msg_handler_callback_t)(void*, std::string topic, std::string recv_message);
	void mv_set_mqtt_msg_handler_callback(mv_mqtt_instance_t instance, mqtt_msg_handler_callback_t callback);

	//------------------------------------------------------------
	// @brief 连接状态改变时间 的通知回调函数 
	// @param instance 客户端句柄
	// @param connect  连接状态 0 连接成功 其他连接失败
	// @return void
	//------------------------------------------------------------
	typedef void(*mqtt_connection_status_callback_t)(void*, int connect);
	void mv_set_mqtt_connection_status_callback(mv_mqtt_instance_t instance, mqtt_connection_status_callback_t callback);

	//------------------------------------------------------------
	// @brief  获取客户端版本号
	// @return 客户端版本字符串
	//------------------------------------------------------------
	std::string mv_mqtt_get_version();

	//------------------------------------------------------------
	// @brief  获取连接状态
	// @return true  在线
	// @return false 离线
	//------------------------------------------------------------
	bool mv_mqtt_keep();

	//------------------------------------------------------------
	// @brief  初始化客户端句柄
	// @return 非空    成功
	// @return nullptr 失败
	//------------------------------------------------------------
	mv_mqtt_instance_t mv_mqtt_create_instance();

	//------------------------------------------------------------
	// @brief  初始化配置 注册消息接收回调函数
	// @brief  客户端句柄
	// @brief  config_path 证书配置文件绝对路径
	// @brief  handle      注册消息接收回调函数
	// @return 0           成功
	// @return -1          失败
	//------------------------------------------------------------
	int mv_mqtt_init_instance(mv_mqtt_instance_t instance, const std::string& config_path, mqtt_msg_handler_callback_t handle);

	//------------------------------------------------------------
	// @brief  连接代理服务器
	// @brief  instance 客户端句柄
	// @return 0        成功
	// @return -1       失败
	//------------------------------------------------------------
	int mv_mqtt_connect(mv_mqtt_instance_t instance);

	//------------------------------------------------------------
	// @brief  订阅消息
	// @brief  instance 客户端句柄
	// @brief  topic    订阅消息主题
	// @brief  qos      消息质量等级
	// @return 0        成功
	// @return -1       失败
	//------------------------------------------------------------
	int mv_mqtt_subscribe(mv_mqtt_instance_t instance, const std::string& topic, int qos);

	//------------------------------------------------------------
	// @brief  发布消息
	// @brief  instance 客户端句柄
	// @brief  topic    发布消息主题
	// @brief  message  发布消息数据
	// @brief  qos      消息质量等级
	// @return 0        成功
	// @return -1       失败
	//------------------------------------------------------------
	int mv_mqtt_publish(mv_mqtt_instance_t instance, const std::string& topic, const std::string& message, int qos);

	//------------------------------------------------------------
	// @brief  发布消息
	// @brief  instance 客户端句柄
	// @brief  topic    取消订阅的消息主题
	// @return 0        成功
	// @return -1       失败
	//------------------------------------------------------------
	int mv_mqtt_unsubscribe(mv_mqtt_instance_t instance, const std::string& topic);

	//------------------------------------------------------------
	// @brief  断开与代理服务器的连接
	// @brief  instance 客户端句柄
	// @brief  timeout  设置超时
	// @return 0        成功
	// @return -1       失败
	//------------------------------------------------------------
	int mv_mqtt_disconnect(mv_mqtt_instance_t instance, int timeout);

	//------------------------------------------------------------
	// @brief  关闭客户端
	// @brief  instance 客户端句柄
	// @return 0        成功
	// @return -1       失败
	//------------------------------------------------------------
	int mv_mqtt_close(mv_mqtt_instance_t instance);

	//------------------------------------------------------------
}

//------------------------------------------------------------
#endif // FACE_TERMINAL_MQTT_H_
